几种情况下，用于推导的一对(A, P)不能从函数调用的参数和函数模板参数中获得。第一种情况发生在获取函数模板地址时，P是函数模板声明的参数化类型，A是初始化或赋值给指针的函数类型。例如:

\begin{lstlisting}[style=styleCXX]
template<typename T>
void f(T, T);

void (*pf)(char, char) = &f;
\end{lstlisting}

例子中，P是void(T, T)， A是void(char, char)。char替换T后，推导成功，pf初始化为特化的地址f<char>。

类似地，函数类型用于P和A的一些特殊情况:

\begin{itemize}
\item 
确定重载函数模板之间的部分顺序

\item 
显式特化与函数模板匹配

\item 
显式实例化与模板匹配

\item 
友元函数模板特化与模板进行匹配

\item 
替换delete操作符或delete[]操作符，new操作符或new[]操作符的模板进行匹配
\end{itemize}

其中一些话题，以及在类模板偏特化中使用模板参数推导，将在第16章中进一步讨论。

另一种特殊情况发生在转换函数模板中。例如:

\begin{lstlisting}[style=styleCXX]
class S {
	public:
	template<typename T> operator T&();
};
\end{lstlisting}

这种情况下，获得(P, A)对，就好像包含一个要转换的类型和一个作为转换函数返回类型的类型:

\begin{lstlisting}[style=styleCXX]
void f(int (&)[20]);

void g(S s)
{
	f(s);
}
\end{lstlisting}

这里，试图将S转换为int(\&)[20]。因此，类型A为int[20]，类型P为T。int[20]替换T，推导成功。

最后，还需要对推导自动占位符类型进行一些特殊处理。这在第15.10.4节中会进行讨论。


































